﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once

#include "IGraphicsNode.h"
#include "RichTextAlignmentType.h"
#include "GcmpApiDeclaration.h"
#include "VertexStreamPrimitiveType.h"
#include "RichTextAnchorPointType.h"

namespace gcmp
{
    class GmIRichText;
    class IDocument;
    class IPolygon;
    class Coordinate3d;

    /// \brief 富文本文字轮廓数据属性
    struct GCMP_GRAPHICS_NODE_INTERFACE_EXPORT TextOutLinePolygonAttribute
    {
        /// \brief 构造函数
        ///
        /// \param position 排版后轮廓数据所属片段的起始位置
        /// \param color 排版后轮廓数据所属片段颜色
        TextOutLinePolygonAttribute(Vector3d position = Vector3d::Zero, Color color = Color::Black) :m_position(position), m_color(color) {};

        Vector3d m_position; //排版后轮廓数据所属片段的起始位置
        Color m_color;  //排版后轮廓数据所属片段颜色
    };

    /// \brief 文字图形节点
    class GCMP_GRAPHICS_NODE_INTERFACE_EXPORT IGraphicsRichText : public IGraphicsNode
    {
        DEFINE_CAST_DERIVED(IGraphicsRichText, IGraphicsNode)

    public:
        /// \brief 析构器
        virtual ~IGraphicsRichText();

        /// \brief 获取调试信息
        ///
        /// \return 调试信息
        virtual std::wstring GetStringForDebug() const = 0;

        /// \biref 设置水平对齐方式
        /// HorizontalAlignmentType::Scatter 分散对齐在文本自动换行的情况下情况下才有效果
        /// \param horizontalAlignment 水平对齐方式(默认向左对齐)
        /// \return ture表示设置成功，否则设置失败
        virtual bool SetHorizontalAlignmentType(HorizontalAlignmentType horizontalAlignment) = 0;

        /// \brief 获取水平对齐方式
        ///
        /// \return 返回水平对齐方式
        virtual HorizontalAlignmentType GetHorizontalAlignmentType() const = 0;

        /// \biref 设置竖直对齐方式
        ///
        /// \param verticalAlignment 竖直对齐方式(默认向上对齐)
        /// \return ture表示设置成功，否则设置失败
        virtual bool SetVerticalAlignmentType(VerticalAlignmentType verticalAlignment) = 0;

        /// \brief 获取竖直对齐方式
        ///
        /// \return 返回竖直对齐方式
        virtual VerticalAlignmentType GetVerticalAlignmentType() const = 0;

        /// \brief 设置文字的流向
        ///
        /// \return true 表示成功，false表示失败
        virtual bool SetDirection(const gcmp::Vector3d& direction) = 0;

        /// \brief 获得文字的流向
        ///
        /// \return 文字的流向
        virtual gcmp::Vector3d GetDirection() const = 0;

        /// \brief 设置acad样式字符串
        ///
        /// \param acadStyleString acad样式字符串,可以是纯文本内容也可以是acad样式字符串
        /// \return ture表示设置成功，否则设置失败
        virtual bool SetAcadStyleString(const std::wstring& acadStyleString) = 0;

        /// \brief 获取acad样式字符串
        ///
        /// \return 返回acad样式字符串
        virtual std::wstring GetAcadStyleString() const = 0;

        /// \brief 字体加粗
        ///
        /// 若acad样式字符串为空，则设置的是缺省为加粗
        /// 若acad样式字符串非空，则整个文字会加粗
        /// \return ture表示设置成功，否则设置失败
        virtual bool Bold() = 0;

        /// \brief 字体缺省是否加粗
        ///
        /// \return 返回字体是否加粗
        virtual bool IsBold() const = 0;

        /// \brief 字体去加粗
        ///
        /// 若acad样式字符串为空，则设置的是缺省为不加粗
        /// 若acad样式字符串非空，则整个文字会不加粗
        /// \return true表示设置成功，否则设置失败
        virtual bool UnBold() = 0;

        /// \brief 字体斜体
        ///
        /// 若acad样式字符串为空，则设置的是缺省为斜体
        /// 若acad样式字符串非空，则整个文字会斜体
        /// \return true表示设置成功，否则设置失败
        virtual bool Italic() = 0;

        /// \brief 字体缺省是否斜体
        ///
        /// \return 返回字体是否斜体
        virtual bool IsItalic() const = 0;

        /// \brief 字体去斜体
        ///
        /// 若acad样式字符串为空，则缺省为不斜体
        /// 若acad样式字符串非空，则整个文字会不斜体
        /// \return true表示去斜体成功，否则失败
        virtual bool UnItalic() = 0;

        /// \brief 字体添加下划线
        ///
        /// 若acad样式字符串为空，则设置缺省加下划线
        /// 若acad样式字符串非空，则设置的是整个文字加下划线
        /// \return true表示添加成功，否则失败
        virtual bool UnderLine() = 0;

        /// \brief 字体整体是否添加下划线
        ///
        /// \return true表示添加下划线
        virtual bool IsUnderLine() const = 0;

        /// \brief 字体去下划线
        ///
        /// 若acad样式字符串为空，不起效，因为当acad样式字符串中仅有文字时缺省就是不加下划线
        /// 若acad样式字符串为空，则整个文字会不加下划线
        /// \return true表示去下划线成功，否则失败
        virtual bool DeUnderLine() = 0;

        /// \brief 设置文字字符高度
        ///
        /// 若acad样式字符串为空，则设置的是缺省的高度；
        /// 若acad样式字符串非空，则会重置整个文字的高度。
        /// \param charHeight 文字字符高度,charHeight应为大于0的值
        /// \param pErrorMessage 错误信息
        /// \return true 表示成功, false 表示失败
        virtual bool SetCharHeight(double charHeight, std::wstring* pErrorMessage) = 0;

        /// \brief 获取文字字符高度
        ///
        /// \return 文字字符高度
        virtual double GetCharHeight() const = 0;

        /// \brief 设置文字锚点的位置
        /// 锚点位置与锚点在水平和竖直方向的定位类型组合起来决定文字节点的真实位置。
        /// \param position 文字锚点的世界坐标
        /// \return true表示设置成功，否则设置失败
        virtual bool SetAnchorPointPosition(const Vector3d& position) = 0;

        /// \brief 获取文字锚点的位置
        /// 锚点位置与锚点在水平和竖直方向的定位类型组合起来决定文字节点的真实位置。
        /// \return 返回文字锚点的世界坐标
        virtual Vector3d GetAnchorPointPosition() const = 0;

        /// \brief 获取文本区域实际使用高度
        ///
        /// 垂直文字流向GetDirection()上的值
        /// \return 文本区域实际使用高度
        virtual double GetTextAreaRealHeight() const = 0;

        /// \brief 获取文本区域实际使用宽度
        ///
        /// 沿文字流向GetDirection()上的值
        /// \return 文本区域实际使用宽度
        virtual double GetTextAreaRealWidth() const = 0;

        /// \brief 设置文字的法线方向
        ///
        /// 文字的法线方向需要与文字流向垂直
        /// \param normal 文字的法线方向
        /// \return 成功返回true，否则返回false
        virtual bool SetNormal(const Vector3d& normal) = 0;

        /// \brief 获取文字的法线方向
        ///
        /// \return 返回文字的法线方向
        virtual Vector3d GetNormal() const = 0;

        /// \breif 设置行间距系数
        ///
        /// 行间距是指上一行文字的顶部与下一行顶部之间的距离。
        /// 行间距系数是指行间距的一个倍数关系，如需要设置单倍行距时，其行间距系数为1.0。
        /// 若在SetAcadStyleString之前调用该接口，则设置的是缺省的行间距系数
        /// 若在SetAcadStyleString之后调用该接口，则会重置整个文字的行间距系数
        /// \param lineSpaceScale 待设置的行间距系数值
        /// \return true表示设置成功，否则设置失败
        virtual bool SetLineSpaceScale(double lineSpaceScale) = 0;

        /// \breif 获取行间距与字高的比例
        ///
        /// 该比例为行间距与该行字高最大值的比例
        /// \return 返回行间距与字高的比例
        virtual double GetLineSpaceScale() const = 0;

        /// \brief 设置文本是否自动换行
        ///
        /// \param isAutoWrap 是否自动换行（默认为true,文本自动换行）
        /// \return true表示设置成功，false表示设置失败
        virtual bool SetIsAutoWrap(bool isAutoWrap) = 0;

        /// \brief 获取文本是否自动换行
        ///
        /// \return true表示文本自动换行，false表示文本不自动换行
        virtual bool IsAutoWrap() const = 0;

        /// \biref 设置默认的字符间距
        ///
        /// 若在SetAcadStyleString之前调用该接口，则设置的是缺省的字符间距；
        /// 若在SetAcadStyleString之后调用该接口，则会重置整个文字的字符间距。
        /// \param characterSpacing 字符间距，characterSpacing应为大于0.75的值
        /// \return ture表示设置成功，否则设置失败
        virtual bool SetCharacterSpacing(double characterSpacing) = 0;

        /// \brief 获取默认的字符间距
        ///
        /// \return 默认的字符间距
        virtual double GetCharacterSpacing() const = 0;

        /// \brief 获取字符的宽度因子
        ///
        /// \return 字符的宽度因子
        virtual double GetWidthFactor() const = 0;

        /// \brief 设置字符的宽度因子
        ///
        /// 若在SetAcadStyleString之前调用该接口，则设置的是缺省的宽度因子；
        /// 若在SetAcadStyleString之后调用该接口，则会重置整个文字的宽度因子。
        /// \param widthFactor 字符的宽度因子,widthFactor应为大于0的值
        /// \return true 表示成功, false 表示失败
        virtual bool SetWidthFactor(double widthFactor) = 0;

        /// \brief 设置文本区域宽度
        ///
        /// 设置的文本区域宽度值将用于(影响)文字的排版，
        /// \param textAreaWidth 文本区域宽度，沿文字流向GetDirection()上的值
        /// \return ture表示设置成功，否则设置失败
        virtual bool SetTextAreaWidth(double textAreaWidth) = 0;

        /// \brief 获取文本区域宽度
        ///
        /// \return 返回文本区域宽度
        virtual double GetTextAreaWidth() const = 0;

        /// \brief 设置文本区域高度
        ///
        /// 设置的文本区域高度值将用于(影响)文字的排版，
        /// \param textAreaHeight 文本区域高度，垂直文字流向GetDirection()上的值
        /// \return true表示设置成功，否则设置失败
        virtual bool SetTextAreaHeight(double textAreaHeight) = 0;

        /// \brief 获取文本区域高度
        ///
        /// \return 返回文本区域高度
        virtual double GetTextAreaHeight() const = 0;

        /// \brief 设置背景填充的样式Id
        ///
        /// 主要设置背景填充的颜色和透明度
        /// \param backgroundFillNodeGraphicsStyleId 背景填充的样式Id
        /// \return 设置成功返回true，否则返回false
        virtual bool SetBackgroundFillNodeGraphicsStyleId(const ElementId& backgroundFillNodeGraphicsStyleId) = 0;

        /// \brief 获取背景填充的样式Id
        ///
        /// \return 返回背景填充的样式Id
        virtual ElementId GetBackgroundFillNodeGraphicsStyleId() const = 0;

        /// \brief 设置背景填充颜色是否使用程序默认颜色
        ///
        /// \param isEnableThemeDefaultColor 是否使用程序默认颜色,默认使用
        /// \return 返回true表示设置成功，否则设置失败
        virtual bool SetIsEnableThemeDefaultColor(bool isEnableThemeDefaultColor) = 0;

        /// \brief 返回背景填充颜色是否使用程序默认颜色
        ///
        /// \return 返回是否使用程序默认颜色
        virtual bool IsEnableThemeDefaultColor() const = 0;

        /// \brief 设置文字全局样式是否覆盖文字局部样式
        ///
        /// \param isUpdateLocalTextStyle 是否覆盖文字的局部样式，默认为true
        /// \return 设置成功返回true,否则返回false
        virtual bool SetIsUpdateLocalTextStyle(bool isUpdateLocalTextStyle) = 0;

        /// \brief 返回文字全局样式是否覆盖文字局部样式
        ///
        /// \return 返回是否覆盖文字的局部样式
        virtual bool IsUpdateLocalTextStyle() const = 0;

        /// \brief 设置字体文件名或字体名
        ///
        /// SetFont()与SetBigFont()可结对使用，SetEnglishAndChineseFont()单独使用，在使用的时候会将另一方先置空
        /// SetFont()非空时，会将GetEnglishAndChineseFont()对应的值置空
        /// 若acad样式字符串为空，则设置的是缺省的字体，若acad样式字符串非空，则会重置整个文本的字体
        /// \param fontName 字体文件名或字体名（（字体文件名需带文件后缀，如simsun.ttc 、 simplex.shx）
        /// \return true表示设置成功，否则设置失败
        virtual bool SetFont(const std::wstring& fontName) = 0;

        /// \brief 获取默认的字体文件名或字体名
        ///
        /// \return 返回默认的字体文件名或字体名
        virtual std::wstring GetFont() const = 0;

        /// \brief 设置大字体文件名
        ///
        /// 正常表示大字体时该接口设置的应该是大字体字体文件名（单线体shx，需要加文件后缀.shx），SetFont设置的应该是小字体文件名（单线体shx），例如SetBigFont(L"gbcbig.shx"); SetFont(L"simplex.shx");其中gbcbig及simplex均为文件格式为.shx的字体文件名
        /// 但是该接口不限制仅能设置大字体，也可以设置trueType、小字体（单线体shx）及其它（字体文件名需带文件后缀，如simsun.ttc 、 simplex.shx）
        /// 若acad样式字符串为空，则设置的是缺省的字体，若acad样式字符串非空，则会重置整个文本的字体（bigFontName为空时，则会采用GetFont（）的值覆盖所有字体）
        /// 大字体情况下不支持加粗、斜体
        /// SetFont()与SetBigFont()可结对使用，SetEnglishAndChineseFont()单独使用，在使用的时候建议会将另一方先置空
        /// SetBigFont()非空时，会将GetEnglishAndChineseFont()对应的值置空
        /// \param bigFontName 大字体文件名或字体名，默认为空(即默认为不使用大字体)
        /// \return true表示设置成功，否则设置失败
        virtual bool SetBigFont(const std::wstring& bigFontName) = 0;

        /// \brief 获取默认的大字体文件名或字体名
        ///
        /// \return 返回默认的大字体文件名或字体名
        virtual std::wstring GetBigFont() const = 0;

        /// \brief 是否大字体优先
        /// 默认为true 大字体优先
        /// \return true 优先使用SetBigFont设置的字体，false 优先使用SetFont设置的字体
        virtual bool IsBigFontPriority() const = 0;

        /// \brief 设置是否大字体优先
        /// 当一个文字使用两个字体的情况，对应的文字字符中如果是两个字体中均有定义的字符，用户可以可通过该接口显示控制在定义上是共性的字符所使用的字体
        /// 当使用SetBigFont和SetFont设置有效字体时，IsBigFontPriority()为true 优先使用SetBigFont设置的字体，IsBigFontPriority()为false 优先使用SetFont设置的字体
        /// 当使用SetAcadStyleString设置的文字内容中同一片段可选两种字体时（标准acad字符串中大字体格式，如\F小字体，大字体；），该优先级仍然有效        
        /// \param isBigFontPriority 是否大字体优先
        /// return true 设置成功，false 设置失败
        virtual bool SetIsBigFontPriority(bool isBigFontPriority) = 0;

        /// \brief 获得RichText的几何信息
        ///
        /// \return 返回RichText的几何接口
        virtual GmIRichText* GetIGmRichText() = 0;
        virtual const GmIRichText* GetIGmRichText()const = 0;

        /// \brief  将RichText文字离散化为显示顶点数据，顶点可能代表三角片或者线体(单线体字体字符)
        ///
        /// 由于字体文件的原因，在一个字符串中可能有线条和三角形，所以可能有多组数据(prmtvtype集合)
        /// 相同索引的vec3List、indexList、prmtvtype是同一组数据，需要放到同一个Renderable中
        /// 不同索引的vec3List、indexList、prmtvtype是不同的数据，必需放到不同的Renderable中
        ///param [out] vec3List 返回离散的三角形顶点集合
        ///param [out] indexList 返回离散的三角形顶点索引集合
        ///param [out] prmtvtypes 返回离散的原语类型集合
        ///return bool true表示离散成功，false表示离散失败（纹理文字状态下离散失败，顶点数据为空）
        virtual bool DiscreteRichText(std::vector<std::vector<Vector3d>>& vec3List, std::vector<std::vector<unsigned int>> &indexList, std::vector<VertexStreamPrimitiveType>& prmtvtypes) = 0;

        /// \brief  获取文字的轮廓数据
        ///
        /// 1. 纹理文字状态下获取的轮廓数据为空
        /// 2. 若片段中文字字符使用单线体（.shx）,则该片段获取的轮廓数据为空
        ///return 富文本文字的轮廓数据集合，每一个属性片段为一组数据
        ///       pair中first为该属性片段中文本的轮廓数据，second为该片段轮廓数据的属性(包括排版后位置及该属性片段所属颜色)
        virtual std::vector<std::pair<gcmp::OwnerPtr<gcmp::IPolygon>, TextOutLinePolygonAttribute>> GetRichTextOutLinePolygon() = 0;

        /// \brief  获得是否需要文字默认留白（默认为true(需要留白)）
        ///
        /// 默认留白包含：1. 每行文字最后一个字符右边字符留白及字符间距系数导致的留白
        ///               2. 最后一行后的行间隙及行间距系数导致的留白
        ///return true 需要默认留白，false不需要默认留白
        virtual bool IsNeedDefaultBlank() const = 0;

        /// \brief  设置是否需要文字默认留白
        /// 
        /// 默认留白包含：1. 每行文字最后一个字符右边字符留白及字符间距系数导致的留白
        ///               2. 最后一行后的行间隙及行间距系数导致的留白
        /// \param isNeedDefaultBlank 是否需要默认留白，默认为true（需要留白）
        ///return true 设置成功，false设置失败
        virtual bool SetIsNeedDefaultBlank(bool isNeedDefaultBlank) = 0;

        /// \brief 设置文字样式名称
        ///
        /// 注意：目前平台没有文字样式的概念，增加该接口是为了让产品端拿到嵌套族里富文本所使用的样式名称
        ///       如果平台后续支持了文字样式，该接口可以考虑去掉
        /// \param textStyleName 文字样式名称
        /// \return 是否设置成功
        virtual bool SetTextStyleName(const std::wstring& textStyleName) = 0;

        /// \brief 获取文字样式名称
        ///
        /// \return 文字样式名称
        virtual std::wstring GetTextStyleName() const = 0;

        /// \brief 设置锚点的水平方向定位类型
        ///
        /// \param horizontalAnchorPointType 水平方向定位类型（默认在左边）
        /// \return true表示设置成功，否则设置失败
        virtual bool SetHorizontalAnchorPointType(HorizontalAnchorPointType horizontalAnchorPointType) = 0;

        /// \brief 获取锚点的水平方向定位类型
        ///
        /// \return 返回锚点的水平方向定位类型
        virtual HorizontalAnchorPointType GetHorizontalAnchorPointType() const = 0;

        /// \brief 设置锚点的竖直方向定位类型
        ///
        /// \param verticalAnchorPointType 竖直方向定位类型（默认在上边）
        /// \return true表示设置成功，否则设置失败
        virtual bool SetVerticalAnchorPointType(VerticalAnchorPointType verticalAnchorPointType) = 0;

        /// \brief 获取锚点的竖直方向定位类型
        ///
        /// \return 返回竖直方向定位类型
        virtual VerticalAnchorPointType GetVerticalAnchorPointType() const = 0;

        /// \brief 设置中西文字体(文件)名
        /// 
        /// 接口用来对中西文字符分别设置字体
        /// 现有SetFont()与SetBigFont()设置字体接口可成对使用，该接口单独使用；使用时会将另一方置空
        /// 中西文字体任一不为空时会将GetFont()、GetBigFont()的值置空，且设置后中英文字体会作用到文本字符串的序列化
        /// \param eFontName 西文字体名，默认为空 (字体文件名需带文件后缀，如simsun.ttc)
        /// \param cFontName 中文字体名，默认为空 (字体文件名需带文件后缀，如simsun.ttc)
        /// \return true 设置成功, false 设置失败
        virtual bool SetEnglishAndChineseFont(const std::wstring& eFontName, const std::wstring& cFontName) = 0;

        /// \brief 获取中英文字体(文件)名
        /// 
        /// \return 返回中英文字体(文件)名，pair中first为西文字体名，second为中文字体名
        virtual std::pair<std::wstring, std::wstring> GetEnglishAndChineseFont() const = 0;

        /// \brief 调整文字节点的流向、法向和左上角坐标使文字节点在某个坐标系下保持可读性
        ///
        /// 调整族载入进来的文字节点，矩阵变换后，在当前坐标系下的可读性
        /// 适用场景：
        ///1. 矩阵变换后的文字节点的法向不等于IGraphicsRichText::Create()时传入坐标系的Z轴。这种情况的可读性在IGraphicsRichText::Transform接口已经处理
        ///2. 载入的文字节点作为视图GRep,在视图GRep生成之后调用此接口调整可读性。
        ///3. 产品目前的场景是左上角点定位，其他定位方式依赖于不同定位类型的正确性。
        /// \param isMirrored 节点是否被镜像过
        /// \param currentCoordinate3d 坐标系
        /// \return void
        virtual void MakeTextReadable(bool isMirrored, const gcmp::Coordinate3d& currentCoordinate3d) = 0;

        /// \brief 设置变换是否调整文字可读性
        /// 
        /// \param adjustReadability true表示调整可读性，false表示不调整可读性（纯几何矩阵变化），默认为true
        /// \return true表示设置成功，否则设置失败
        virtual bool SetIsTransformAdjustReadability(bool adjustReadability) = 0;

        /// \brief 获取变换是否调整文字可读性
        /// 
        /// \return true表示调整可读性，false表示不调整可读性（纯几何矩阵变化）
        virtual bool IsTransformAdjustReadability() const = 0;

    public:
        /// \brief 创建文字图形节点
        /// 
        /// \param pDocumnet 富文本图形节点所属文档
        /// \param acadStyleString acad样式的字符串,，可以是纯文本内容也可以是cad样式的字符串
        /// \param position 文字位置(默认是文字范围的左上角)
        /// \param textAreaWidth 文本范围-宽度(水平),必须是大于0的值
        /// \param textAreaHeight 文本范围 -高度(竖直)，必须是大于0的值
        /// \param isAutoWrap 文本是否自动换行(当某行文字总体宽度超过文本范围宽度是是否自动换行)
        /// \param coordinate 文字所在平面的坐标系，为了兼容以前的移动、旋转、镜像行为，默认设置为非法值。
        ///                   坐标系设置为有效值时，旋转、镜像行为不依赖于文字是否翻转开关，始终保持文字可读。
        /// \param isEnableBackgroundFill 是否使能背景填充。true开启背景填充，否则不开启。默认为false
        /// \return 文字图形节点
        static OwnerPtr<IGraphicsRichText> Create(const IDocument* pDocumnet, const std::wstring& acadStyleString, const gcmp::Vector3d& position, 
            double textAreaWidth, double textAreaHeight, bool isAutoWrap, bool isEnableBackgroundFill = false, Coordinate3d coordinate = Coordinate3d(Vector3d::Zero, Vector3d::Zero, Vector3d::Zero));
    public:
        /// \brief 创建文字图形节点
        /// \param acadStyleString acad样式的字符串
        /// \param position 文字位置(左上角)
        /// \param textAreaWidth 文本范围-宽度(水平)
        /// \param textAreaHeight 文本范围 -高度(竖直)
        /// \param isAutoWrap 文本是否自动换行(当某行文字总体宽度超过文本范围宽度是是否自动换行)
        /// \return 文字图形节点
        GCMP_OBSOLETE_API(2020/12/01, IGraphicsRichText::Create(const IDocument*, std::wstring&, const gcmp::Vector3d&, double, double, bool)) static OwnerPtr<IGraphicsRichText> Create(const std::wstring& acadStyleString, const gcmp::Vector3d & position, double textAreaWidth, double textAreaHeight, bool isAutoWrap);

        /// \brief 设置字体文件名
        ///
        /// 若acad样式字符串为空，则设置的是缺省的字体
        /// 若acad样式字符串非空，则会重置整个文本的字体
        /// \param fontFileName 字体文件名
        /// \return true表示设置成功，否则设置失败
        GCMP_OBSOLETE_API(2021/05/01, IGraphicsRichText::SetFont(const std::wstring& fontName)) virtual bool SetFontFileName(const std::wstring& fontFileName) = 0;

        /// \brief 获取默认的字体文件名
        ///
        /// \return 返回默认的文字字体
        GCMP_OBSOLETE_API(2021/05/01, IGraphicsRichText::GetFont()) virtual std::wstring GetFontFileName() const = 0;

        /// \brief 设置文字左上角位置
        /// SetLeftTopPointPosition()方法即将被废弃，请不要与新方法SetAnchorPointPosition()、Set/GetHorizontalAnchorPointType()、Set/GetVerticalAnchorPointType()方法混合使用。
        /// \param position 文字左上角点
        /// \return true 表示成功, false 表示失败
        GCMP_OBSOLETE_API(2023/03/01, IGraphicsRichText::SetAnchorPointPosition(const Vector3d&)) virtual bool SetLeftTopPointPosition(const Vector3d& position) = 0;

        /// \brief 获得文字左上角位置
        /// GetLeftTopPointPosition()方法即将被废弃，请不要与新方法GetAnchorPointPosition()混合使用。
        /// \return 文字左上角位置
        GCMP_OBSOLETE_API(2023/03/01, IGraphicsRichText::GetAnchorPointPosition()) virtual Vector3d GetLeftTopPointPosition() const = 0;
    };
}
